// import router from './router'
// import store from './store'
// import { Message } from 'element-ui'
// import NProgress from 'nprogress' // progress bar
// import 'nprogress/nprogress.css' // progress bar style
// import { getToken } from '@/utils/auth' // get token from cookie
// import getPageTitle from '@/utils/get-page-title'

// NProgress.configure({ showSpinner: false }) // NProgress Configuration

// const whiteList = ['/login'] // no redirect whitelist

// router.beforeEach(async(to, from, next) => {
//   // start progress bar
//   NProgress.start()

//   // set page title
//   document.title = getPageTitle(to.meta.title)

//   // determine whether the user has logged in
//   const hasToken = getToken()

//   if (hasToken) {
//     if (to.path === '/login') {
//       // if is logged in, redirect to the home page
//       next({ path: '/' })
//       NProgress.done()
//     } else {
//       const hasGetUserInfo = store.getters.name
//       if (hasGetUserInfo) {
//         next()
//       } else {
//         try {
//           // get user info
//           await store.dispatch('user/getInfo')

//           next()
//         } catch (error) {
//           // remove token and go to login page to re-login
//           await store.dispatch('user/resetToken')
//           Message.error(error || 'Has Error')
//           next(`/login?redirect=${to.path}`)
//           NProgress.done()
//         }
//       }
//     }
//   } else {
//     /* has no token*/

//     if (whiteList.indexOf(to.path) !== -1) {
//       // in the free login whitelist, go directly
//       next()
//     } else {
//       // other pages that do not have permission to access are redirected to the login page.
//       next(`/login?redirect=${to.path}`)
//       NProgress.done()
//     }
//   }
// })

// router.afterEach(() => {
//   // finish progress bar
//   NProgress.done()
// })
// import store from '@/store'
// import router from '@/router'
// router.beforeEach((to, from, next) => {
//   if (store.getters.token) {
//     // 有登陆
//     if (to.path === '/login') {
//       // 有登陆，在首页想去登录页直接跳到首页
//       next('/')
//     } else {
//       // 否则就放行
//       next()
//     }
//   } else {
//     // 没登录，想去其他页面
//     const whileList = ['/login', '/404', '/test']
//     if (whileList.indexOf(to.path) > -1) {
//       // 如果想去的页面在白名单中，就放行
//       next()
//     } else {
//       // 如果不在白名单中，直接跳去登录页
//       next('/login')
//     }
//   }
// })

// 另一种写法 没有if else 的嵌套关系那么乱
// 还有另一种写法  是用includes 语法
import store from '@/store'
import router from '@/router'
// 加async await 的意义 ：当刷新的进入页面的时候。没有数据就应该发送请求获取，但是如果已经在页面再进行跳转，因为前面已经拿过数据，就不需要再拿数据，可以把数据截取住并进行相应操作
router.beforeEach(async(to, from, next) => {
  const url = to.path
  const token = store.getters.token
  const whiteList = ['/login', '/404', '/test']
  if (token && url === '/login') {
    // 有登陆，在首页想去登录页直接跳到首页
    next('/')
  }
  // 2. 有登陆+不去登录页 = 放行
  if (token && url !== '/login') {
    // 优化如果已经有了username就不再获取
    // 不过这里不能单独判断对象, 需要判断里面的值
    // 否则 {} 空对象在判断时永远转换为 true
    // 刷新进入页面时,没有数据,应该获取
    // 但是如果已经在页面里面, 在进行跳转
    // 因为之前数据已经那个, 就不需要再拿
    if (!store.getters.name) {
      await store.dispatch('user/getUserInfo')
      // 异步追加 filterRoutes 筛选的权限
      // 这一刻拿完了用户数据, 又还没有进入页面, 就可以进行权限数据的筛选
      // 由于权限数据需要共用, 所以封装到 vuex 当中
      const res = await store.dispatch('permission/filterRoutes', store.getters.menus)
      // 追加能访问的权限 addRoutes能使用，但是addRoute 是一个undefind无法使用和文档的不一样
      // 追加路由访问(菜单还没恢复, 另外刷新也会404, 后面在处理)
      // router.addRoutes(res)
      router.addRoutes([
        ...res,
        // 刚开始是没有数据的，通过getters的menus共享数据，再把经过过滤的数据通过异步actions追加到新的路由里
        // 把 404页面 放到查找页面名之后再执行,如果是有找到就不会跳转。否则就跳转,原先是直接指向了404页面，所以导致了明明在页面里但是刷新后直接跳转到了404页面，把404页面放到查找页面名之后再执行虽然没有了404页面，但是页面里会是一片空白
        // 这些路由都匹配不上了再转向 404
        { path: '*', redirect: '/404', hidden: true }
      ])
      // 所以需要我们设置重新跳转一次路径，触发路由再一次寻找对应的页面名，重新执行一遍新的路由代码逻辑
      next(to.path)
      return
    }
    next()
  }
  // 3. 没登录+在白名单 = 放行
  // if (!token && whiteList.indexOf(url) > -1) {
  if (!token && whiteList.includes(url) > -1) {
    next()
  }
  // 4 没登录+不在白名单 =登录页
  // if (!token && whiteList.indexOf(url) === -1) {
  if (!token && whiteList.includes(url) === -1) {
    next('/login')
  }
})
